home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CUCD / Programming / OUI / envman.lha / EnvManager / envopt.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1997-10-20  |  10.9 KB  |  413 lines

  1. // $Id$
  2. #include <exec/types.h>
  3. #include <graphics/gfxbase.h>
  4. #include <libraries/gadtools.h>
  5. #include <proto/dos.h>
  6. #include <proto/asl.h>
  7. #include <proto/graphics.h>
  8. #include <proto/wb.h>
  9. #include <clib/macros.h>
  10. #include <mydebug.h>
  11.  
  12. #include <screen.h>
  13. #include <gadgets/checkbox.h>
  14. #include <gadgets/string.h>
  15. #include <gadgets/cnumber.h>
  16. #include <gadgets/cstring.h>
  17. #include <gadgets/fbutton.h>
  18. #include <locale.h>
  19. #include <compiler.h>
  20.  
  21. #include "envdef.h"
  22. #include "envopt.h"
  23. #include "enventry.h"
  24.  
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <unistd.h>
  28.  
  29. #ifdef open
  30. #undef open
  31. #endif
  32.  
  33. IMPORT TTextAttr    Tiny ;
  34. IMPORT TTextAttr    Normal ;
  35. IMPORT enventry     *curenv ;
  36. IMPORT nlist        *envlist ;
  37. IMPORT nlist        *envarclist ;
  38.  
  39. long okid, cancelid ;
  40. static char filename[256] ;
  41. static char path[256] ;
  42.  
  43. IMPORT lstring FAR alias ;
  44. IMPORT lstring FAR local2 ;
  45. IMPORT lstring FAR global2 ;
  46. IMPORT lstring FAR archived ;
  47. IMPORT lstring FAR binary ;
  48. IMPORT lstring FAR nullterm ;
  49. IMPORT lstring FAR vsize ;
  50. IMPORT lstring FAR contents ;
  51. IMPORT lstring FAR contents2 ;
  52. IMPORT lstring FAR name ;
  53. IMPORT lstring FAR edit ;
  54. IMPORT lstring FAR import ;
  55. IMPORT lstring FAR export ;
  56. IMPORT lstring FAR edition ;
  57. IMPORT lstring FAR importfrom ;
  58. IMPORT lstring FAR exportto ;
  59.  
  60.  
  61. BOOL OpenAsl(void)
  62. {
  63.     AslBase = OpenLibrary((UBYTE *)"asl.library", 0) ;
  64.     return (AslBase)?TRUE:FALSE ;
  65. }
  66.  
  67.  
  68. void CloseAsl(void)
  69. {
  70.     if (AslBase)
  71.         CloseLibrary(AslBase) ;
  72. }
  73.  
  74. FileRequester *InitAslFileReq(screen *s, STRPTR drawer, STRPTR title)
  75. {
  76. FileRequester *fr = NULL ;
  77.  
  78.     if (OpenAsl()) {
  79.         fr = (FileRequester *)AllocAslRequestTags(ASL_FileRequest,
  80.             ASLFR_Screen,           s->scr,
  81.             ASLFR_RejectIcons,      TRUE,
  82.             ASLFR_TitleText,        title,
  83.             ASLFR_InitialDrawer,    drawer,
  84.             TAG_DONE) ;
  85.     }
  86.     return fr ;
  87. }
  88.  
  89. inline void CloseAslFileReq(FileRequester *fr)
  90. {
  91.     FreeAslRequest(fr) ;
  92.     CloseAsl() ;
  93. }
  94.  
  95. BOOL getdir(screen *s, STRPTR drawer, STRPTR title)
  96. {
  97. FileRequester *fr ;
  98. BOOL retval = FALSE ;
  99.  
  100.     if (fr = InitAslFileReq(s, drawer, title)) {
  101.         if (AslRequestTags(fr,
  102.             ASLFR_DrawersOnly, TRUE,
  103.             TAG_DONE)) {
  104.             strcpy(drawer, fr->fr_Drawer) ;
  105.             retval = TRUE ;
  106.         }
  107.         CloseAslFileReq(fr) ;
  108.     }
  109.     return retval ;
  110. }
  111.  
  112. BOOL getfile(screen *s, STRPTR name, STRPTR drawer, STRPTR pat, STRPTR title, BOOL savemode)
  113. {
  114. FileRequester *fr ;
  115. BOOL retval = FALSE ;
  116.  
  117.     if (fr = InitAslFileReq(s, drawer, title)) {
  118.         if (AslRequestTags(fr,
  119.             ASLFR_InitialFile,      name,
  120.             ASLFR_InitialPattern,   pat,
  121.             ASLFR_DoSaveMode,       savemode,
  122.             ASLFR_DoPatterns,       TRUE,
  123.             TAG_DONE)) {
  124.             strcpy(name, fr->fr_File) ;
  125.             strcpy(drawer, fr->fr_Drawer) ;
  126.             retval = TRUE ;
  127.         }
  128.         CloseAslFileReq(fr) ;
  129.     }
  130.     return retval ;
  131. }
  132.  
  133. BOOL getfiles(screen *s, STRPTR name, STRPTR drawer, STRPTR pat, STRPTR title, STRPTR **fliste, LONG& num)
  134. {
  135. FileRequester   *fr ;
  136. BOOL            retval = FALSE ;
  137. WBArg           *wa ;
  138. int             i ;
  139. STRPTR          *t ;
  140.  
  141.  
  142.     if (fr = InitAslFileReq(s, drawer, title)) {
  143.         if (AslRequestTags(fr,
  144.             ASLFR_InitialFile,      name,
  145.             ASLFR_InitialPattern,   pat,
  146.             ASLFR_DoPatterns,       TRUE,
  147.             ASLFR_DoMultiSelect,    TRUE,
  148.             TAG_DONE)) {
  149.             strcpy(name, fr->fr_File) ;
  150.             strcpy(drawer, fr->fr_Drawer) ;
  151.             num = fr->fr_NumArgs ;
  152.             wa = fr->fr_ArgList ;
  153.             t = new STRPTR[num] ;
  154.             for (i=0; i<num; i++) {
  155.                 t[i] = new char[strlen((char *)wa[i].wa_Name)+1] ;
  156.                 strcpy(t[i], (char *)wa[i].wa_Name) ;
  157.             }
  158.             *fliste = t ;
  159.             retval = TRUE ;
  160.         }
  161.         CloseAslFileReq(fr) ;
  162.     }
  163.     return retval ;
  164. }
  165.  
  166.  
  167.  
  168.  
  169. void optwindow::fedit(gadget *g, ULONG classe, USHORT code)
  170. {
  171. char Cmd[255] ;
  172. char TmpName[255] ;
  173. char EdName[255] ;
  174. BPTR tmp ;
  175. FileInfoBlock ALIGNED fib ;
  176. enventry    *edenv ;
  177.  
  178.  
  179.     if (edenv = findvar("EDITOR"))
  180.         strcpy(EdName, edenv->contents) ;
  181.     else
  182.         strcpy(EdName, "Ed") ;
  183.  
  184.     strcpy(TmpName, "T:EnvManXXXXXXXX") ;
  185.     mktemp(TmpName) ;
  186.     tmp = Open(TmpName, MODE_NEWFILE) ;
  187.     if (tmp) {
  188.         Write(tmp, curenv->contents, curenv->size) ;
  189.         Close(tmp) ;
  190.         strcpy(Cmd, EdName) ;
  191.         strcat(Cmd, " ") ;
  192.         strcat(Cmd, TmpName) ;
  193.         System(Cmd, NULL) ;
  194.         tmp = Open(TmpName, MODE_OLDFILE) ;
  195.         if (tmp) {
  196.             ExamineFH(tmp, &fib) ;
  197.             curenv->size = fib.fib_Size ;
  198.             delete curenv->contents ;
  199.             curenv->contents = new char[curenv->size+1] ;
  200.             Read(tmp, curenv->contents, curenv->size) ;
  201.             curenv->contents[curenv->size] = '\0' ;
  202.             curenv->setentry() ;
  203.             Close(tmp) ;
  204.             DeleteFile(TmpName) ;
  205.         }
  206.     }
  207. }
  208.  
  209. void optwindow::fimport(gadget *g, ULONG classe, USHORT code)
  210. {
  211. BPTR fic ;
  212. char    file[256] ;
  213. FileInfoBlock ALIGNED fib ;
  214.  
  215.     if (getfile(ws, filename, path, "#?", importfrom.charptr(), FALSE)) {
  216.         strcpy(file, path) ;
  217.         AddPart(file, filename, 256) ;
  218.         fic = Open(file, MODE_OLDFILE) ;
  219.         if (fic) {
  220.             ExamineFH(fic, &fib) ;
  221.             curenv->size = fib.fib_Size ;
  222.             delete curenv->contents ;
  223.             curenv->contents = new char[curenv->size+1] ;
  224.             Read(fic, curenv->contents, curenv->size) ;
  225.             Close(fic) ;
  226.             curenv->setentry() ;
  227.             if (scontents) {
  228.                 scontents->set(curenv->contents) ;
  229.             }
  230.         }
  231.     }
  232. }
  233.  
  234. void optwindow::fexport(gadget *g, ULONG classe, USHORT code)
  235. {
  236. BPTR    fic ;
  237. char    file[256] ;
  238.  
  239.     if (getfile(ws, filename, path, "#?", exportto.charptr(), TRUE)) {
  240.         strcpy(file, path) ;
  241.         AddPart(file, filename, 256) ;
  242.         fic = Open(file, MODE_NEWFILE) ; // Tester l'overwrite qd même !
  243.         if (fic) {
  244.             Write(fic, curenv->contents, curenv->size) ;
  245.             Close(fic) ;
  246.         }
  247.     }
  248. }
  249.  
  250. void optwindow::finfo(gadget *g, ULONG classe, USHORT code)
  251. {
  252. BPTR lock, fic ;
  253. char dirname[80] ;
  254. char fname[80] ;
  255. FileInfoBlock ALIGNED fib ;
  256.  
  257.     strcpy(fname, FilePart(curenv->name)) ;
  258.     fname[strlen(fname)-5] = '\0' ;
  259.     if (curenv->isarchived()) {
  260.         strcpy(dirname, "ENVARC:") ;
  261.     }
  262.     else {
  263.         strcpy(dirname, "ENV:") ;
  264.     }
  265.     AddPart(dirname, curenv->name, 80) ;
  266.  
  267.     *(PathPart(dirname)) = '\0' ;
  268.     if(lock = Lock(dirname, ACCESS_READ)) {
  269.         WBInfo(lock, fname, ws->scr) ;
  270.         AddPart(dirname, fname, 80) ;
  271.         strcat(dirname, ".info") ;
  272.         if (fic = Open(dirname, MODE_OLDFILE)) {
  273.             ExamineFH(fic, &fib) ;
  274.             curenv->size = fib.fib_Size ;
  275.             delete curenv->contents ;
  276.             curenv->contents = new char[curenv->size+1] ;
  277.             Read(fic, curenv->contents, curenv->size) ;
  278.             Close(fic) ;
  279.             curenv->setentry() ;
  280.             if (scontents) {
  281.                 scontents->set(curenv->contents) ;
  282.             }
  283.         }
  284.         UnLock(lock) ;
  285.     }
  286. }
  287.  
  288. void optwindow::handlevkey(USHORT code)
  289. {
  290.     if (code == 0x0D) {
  291.         g->selectgadget(okid, FALSE) ;
  292.     }
  293.     else if (code == 0x1B) {
  294.         g->selectgadget(cancelid, FALSE) ;
  295.     }
  296.     else {
  297.         g->parsegadgets(code) ;
  298.     }
  299. }
  300.  
  301. void optwindow::open(screen *ns)
  302. {
  303. long mw ;
  304. long ml ;
  305. long mt ;
  306. long bh ;
  307. long bw ;
  308. gadget *l ;
  309.  
  310.     ws = ns ;
  311.     g = new gadgetlist(this, 17) ;
  312.  
  313.     g->setfont(&Normal) ;
  314.     bh = g->fontheight ;
  315.     bw = MAX((bh*ws->xratio)/ws->yratio, g->fontheight) + 4 ;
  316.     bh += 4 ;
  317.     // Colonne 1
  318.  
  319.     mw = g->lmax(alias, local2, global2, archived, NULL) + 20 ;
  320.  
  321.     g->box(mw, ws->winbarheight+8, bw, bh) ;
  322.     new checkbox(g, NULL, alias, curenv->isalias(), PLACETEXT_LEFT, TRUE) ;
  323.  
  324.     g->box(g->left, g->maxh+8, bw, bh) ;
  325.     new checkbox(g, NULL, local2, curenv->islocale(), PLACETEXT_LEFT, TRUE) ;
  326.  
  327.     g->box(g->left, g->maxh+8, bw, bh) ;
  328.     cglob = new checkbox(g, NULL, global2, curenv->isglobal(), PLACETEXT_LEFT, curenv->isalias()) ;
  329.  
  330.     // Colonne 2
  331.  
  332.     mw = g->lmax(binary, nullterm, vsize, NULL) + 20 ;
  333.     g->box(g->maxw+mw, ws->winbarheight+8, bw, bh) ;
  334.     new checkbox(g, NULL, binary, curenv->isbinary(), PLACETEXT_LEFT, TRUE) ;
  335.  
  336.     g->box(g->left, g->top+g->height+8, bw, bh) ;
  337.     new checkbox(g, NULL, nullterm, curenv->isnullterm(), PLACETEXT_LEFT, TRUE) ;
  338.  
  339.     g->box(g->left, g->top+g->height+8, bw, bh) ;
  340.     carch = new checkbox(g, NULL, archived, curenv->isarchived(), PLACETEXT_LEFT, curenv->isalias()) ;
  341.  
  342.     // Colonne 3
  343.     mw = g->lmax(name, contents, NULL) ;
  344.     ml = g->maxw+8 ;
  345.  
  346.     g->box(ml, ws->winbarheight+8, mw+8, g->fontheight+4) ;
  347.     new cstring(g, NULL, name, NULL, FALSE, PLACETEXT_IN) ;
  348.  
  349.     g->box(g->maxw+8, g->top, 200, g->fontheight+4) ;
  350.     new string(g, NULL, NULL, curenv->name, MAX(strlen(curenv->name)+1, MAXNAME)) ;
  351.  
  352.  
  353.     if (curenv->isbinary() || curenv->islocale() || curenv->isalias()) {
  354.         g->box(ml, g->top+g->height+8, mw+8, g->fontheight+4) ;
  355.         new cstring(g, NULL, contents2, NULL, FALSE, PLACETEXT_IN) ;
  356.         g->box(g->left+g->width+8, g->top, 200, g->fontheight+4) ;
  357.         new cstring(g, NULL, NULL, curenv->contents,TRUE, PLACETEXT_IN) ;
  358.         scontents = NULL ;
  359.     }
  360.     else {
  361.         g->box(ml, g->top+g->height+8, mw+8, g->fontheight+4) ;
  362.         new cstring(g, NULL, contents, NULL, FALSE, PLACETEXT_IN) ;
  363.         g->box(g->left+g->width+8, g->top, 200, g->fontheight+4) ;
  364.         scontents = new string(g, NULL, NULL, curenv->contents, MAX(curenv->size+1, MAXNAME)) ;
  365.     }
  366.  
  367.     g->box(g->left, g->top+g->height+8, g->ltext("99999")+8, g->fontheight+4) ;
  368.     new cnumber(g, NULL, vsize, curenv->size, TRUE, PLACETEXT_LEFT) ;
  369.  
  370.     mw = g->lmax(edit, import, export, "Info", NULL) + 8 ;
  371.     ml = 20 ;
  372.     mt = g->maxh+8 ;
  373.  
  374.     if (!curenv->isalias() && !curenv->islocale()) {
  375.         if (curenv->isbinary() && curenv->isnullterm()) {
  376.             g->box(ml, mt, mw, g->fontheight+4) ;
  377.             ml += mw + 8 ;
  378.             new fbutton(g, WFUNC(&optwindow::fedit), edit, FALSE) ;
  379.         }
  380.         g->box(ml, mt, mw, g->fontheight+4) ;
  381.         ml += mw + 8 ;
  382.         new fbutton(g, WFUNC(&optwindow::fimport), import, FALSE) ;
  383.     }
  384.  
  385.     g->box(ml, mt, mw, g->fontheight+4) ;
  386.     ml += mw + 8 ;
  387.     l = new fbutton(g, WFUNC(&optwindow::fexport), export, FALSE) ;
  388.  
  389.     if (curenv->isinfo() && !curenv->islocale()) {
  390.         g->box(ml, mt, mw, g->fontheight+4) ;
  391.         l = new fbutton(g, WFUNC(&optwindow::finfo), "_Info", FALSE) ;
  392.     }
  393.  
  394.     okid = l->id + 1 ;
  395.     cancelid = l->id + 2 ;
  396.  
  397.     width = short(g->maxw-ws->scr->WBorLeft+20) ;
  398.     height = short(g->maxh-ws->winbarheight+8) ;
  399.  
  400.     prepbox(TRUE) ;
  401.  
  402.     _open(NULL, SCROLLERIDCMP|ARROWIDCMP|STRINGIDCMP|BUTTONIDCMP|
  403.                 IDCMP_VANILLAKEY|IDCMP_MOUSEBUTTONS,
  404.         WA_Title,           edition,
  405.         WA_Gadgets,         g->glist,
  406.         WA_DragBar,         TRUE,
  407.         WA_DepthGadget,     TRUE,
  408.         WA_Activate,        TRUE,
  409.         TAG_DONE) ;
  410.  
  411.     if (initok) g->updategadgets() ;
  412. }
  413.